今天我們的任務是要來更了解一點Session。所以,讓我門先回顧一下 Session 機制。
在傳統的 Web 系統中,Session 的出現解決了 Basic Authentication 的最大問題 ——「每次都要傳帳密」。
這樣的機制既能避免帳號密碼多次暴露,又能保存狀態,是一個非常好用的方案。
但當系統越來越龐大,Session 就會變成負擔:
這些限制讓工程師開始思考: 能不能不要 Session?
如果我們拿掉 Session,那會發生什麼事?
答案就是又回到了過去:
舉例來說,你要呼叫 /hello
API:
Authorization: user:password
。這樣的方式雖然「無狀態」(伺服器完全不記住你),但很快就會出現問題:
所以,雖然這種做法避免了 Session 的記憶體問題,但體驗和安全性都糟糕到不行。
工程師們進一步思考:
「如果使用者不用每次都傳帳密,而是伺服器簽發一個 Token,使用者之後只要帶 Token,就能被認出來,那不就解決了嗎?」
於是有了「無狀態 Token」的概念:
聽起來好像很棒,但還是有幾個問題:
於是大家需要一種「自帶資訊」的 Token。
為了幫助理解,我整理了一張比較表:
機制 | Basic Authentication | 無狀態 Token(簡單字串) | JWT(JSON Web Token) |
---|---|---|---|
帶的內容 | 帳號密碼(每次傳) | 一個隨機字串(Token) | JSON 結構(User、Role、Expire…) |
儲存位置 | 客戶端(Header) | 客戶端(Header) | 客戶端(Header / LocalStorage) |
安全性 | 低(Base64 可解碼) | 中(難猜,但可被盜用) | 高(簽名驗證,防竄改) |
可攜帶資訊 | 無 | 幾乎沒有 | 豐富(帳號、角色、過期時間等) |
是否 Stateless | 是 | 是 | 是 |
缺點 | 每次傳帳密,易外洩 | 資訊不足,無法安全失效 | 一旦發出,需搭配 Refresh Token / 黑名單管理 |
從我們整理出來的表格可以看出:
今天我們從 Session 的優缺點 出發,模擬了「沒有 Session」的極端情境。
今天的我們更了解了Session跟其他驗證方式的比較,明天,我們將正式進入 JWT 的世界:
大家明天見!